React Lazy Loading : Division du code en composants pour une performance optimisée | MLOG | MLOG
React Lazy Loading : Division du code en composants pour une performance optimisée
Dans le monde numĂ©rique actuel, oĂč tout va trĂšs vite, la performance des sites web est primordiale. Les utilisateurs s'attendent Ă une satisfaction immĂ©diate, et les temps de chargement lents peuvent entraĂźner de la frustration, des abandons de panier et une image de marque nĂ©gative. Pour les applications React, l'optimisation des performances est essentielle pour offrir une expĂ©rience utilisateur fluide et engageante. Une technique puissante pour y parvenir est le lazy loading avec la division du code en composants.
Qu'est-ce que le Lazy Loading et la division du code ?
Le lazy loading est une technique oĂč les ressources, telles que les images, les scripts et les composants, ne sont chargĂ©es que lorsqu'elles sont nĂ©cessaires, plutĂŽt que toutes en une seule fois lors du chargement initial de la page. Cela rĂ©duit considĂ©rablement la quantitĂ© de donnĂ©es qui doivent ĂȘtre tĂ©lĂ©chargĂ©es et analysĂ©es au dĂ©part, ce qui se traduit par des temps de chargement initiaux plus rapides et une amĂ©lioration de la performance perçue.
La division du code est le processus de division du code de votre application en morceaux (ou bundles) plus petits et plus gĂ©rables. Cela permet au navigateur de ne tĂ©lĂ©charger que le code nĂ©cessaire Ă la vue initiale, en diffĂ©rant le chargement des autres codes jusqu'Ă ce qu'ils soient rĂ©ellement requis. Le lazy loading exploite la division du code pour charger des composants spĂ©cifiques uniquement lorsqu'ils sont sur le point d'ĂȘtre rendus.
Pourquoi utiliser le Lazy Loading et la division du code dans React ?
Voici pourquoi vous devriez envisager d'intégrer le lazy loading et la division du code dans vos projets React :
Temps de chargement initial amélioré : En ne chargeant que les composants essentiels au départ, vous pouvez réduire considérablement le temps nécessaire pour que la page devienne interactive. Ceci est particuliÚrement bénéfique pour les utilisateurs ayant des connexions Internet lentes ou sur des appareils mobiles.
Taille du bundle réduite : La division du code réduit la taille du bundle JavaScript initial, ce qui entraßne des temps de téléchargement et d'analyse plus rapides.
Expérience utilisateur améliorée : Un site web qui se charge plus rapidement offre une expérience utilisateur plus fluide et plus agréable, ce qui entraßne une augmentation de l'engagement et des taux de conversion.
Meilleure performance sur les appareils bas de gamme : Le lazy loading peut améliorer considérablement les performances sur les appareils dont la puissance de traitement et la mémoire sont limitées, car ils n'ont pas à charger et à traiter l'ensemble de l'application au départ.
Avantages SEO : Les moteurs de recherche privilĂ©gient les sites web dont les temps de chargement sont plus rapides, de sorte que la mise en Ćuvre du lazy loading peut avoir un impact positif sur votre classement dans les moteurs de recherche.
Comment implémenter le Lazy Loading dans React
React offre une prise en charge intégrée du lazy loading à l'aide des composants React.lazy et Suspense. Voici un guide étape par étape :
1. Utilisation de React.lazy()
React.lazy() vous permet d'importer dynamiquement des composants, divisant ainsi efficacement votre code en morceaux séparés. Il prend une fonction qui appelle import(), qui renvoie une Promise qui résout au composant.
const MyComponent = React.lazy(() => import('./MyComponent'));
Dans cet exemple, MyComponent ne sera chargĂ© que lorsqu'il sera sur le point d'ĂȘtre rendu.
2. Enveloppement avec <Suspense>
Ătant donnĂ© que React.lazy() utilise des importations dynamiques, qui sont asynchrones, vous devez envelopper le composant chargĂ© paresseusement avec un composant <Suspense>. Le composant <Suspense> vous permet d'afficher une interface utilisateur de repli (par exemple, une animation de chargement) pendant que le composant est en cours de chargement.
import React, { Suspense } from 'react';
function MyPage() {
return (
Loading... }>
);
}
Dans cet exemple, le message Loading... s'affichera pendant que MyComponent est en cours de chargement. Une fois le composant chargé, il remplacera l'interface utilisateur de repli.
3. Exemple pratique : Lazy Loading d'une grande galerie d'images
ConsidĂ©rons un scĂ©nario oĂč vous avez une grande galerie d'images. Le chargement de toutes les images en une seule fois peut avoir un impact important sur les performances. Voici comment vous pouvez charger paresseusement les images Ă l'aide de React.lazy() et <Suspense> :
import React, { Suspense } from 'react';
const LazyImage = React.lazy(() => import('./Image'));
function ImageGallery() {
const images = [
{ id: 1, src: 'image1.jpg', alt: 'Image 1' },
{ id: 2, src: 'image2.jpg', alt: 'Image 2' },
{ id: 3, src: 'image3.jpg', alt: 'Image 3' },
// ... more images
];
return (
{images.map(image => (
Loading image...
}>
))}
);
}
export default ImageGallery;
Et le composant Image.js :
import React from 'react';
const Image = ({ src, alt }) => {
return ;
};
export default Image;
Dans cet exemple, chaque image est enveloppĂ©e dans un composant <Suspense>, de sorte qu'un message de chargement s'affiche pour chaque image pendant son chargement. Cela empĂȘche le blocage de toute la page pendant le tĂ©lĂ©chargement des images.
Techniques avancées et considérations
1. Limites d'erreur
Lorsque vous utilisez le lazy loading, il est important de gĂ©rer les erreurs potentielles qui peuvent survenir pendant le processus de chargement. Les limites d'erreur peuvent ĂȘtre utilisĂ©es pour intercepter ces erreurs et afficher une interface utilisateur de repli. Vous pouvez crĂ©er un composant de limite d'erreur comme ceci :
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
console.error(error, errorInfo);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return Something went wrong. ;
}
return this.props.children;
}
}
export default ErrorBoundary;
Ensuite, enveloppez le composant <Suspense> avec le <ErrorBoundary> :
Loading...}>
Si une erreur se produit lors du chargement de MyComponent, le <ErrorBoundary> l'interceptera et affichera l'interface utilisateur de repli.
2. Rendu cÎté serveur (SSR) et Lazy Loading
Le lazy loading peut Ă©galement ĂȘtre utilisĂ© en conjonction avec le rendu cĂŽtĂ© serveur (SSR) pour amĂ©liorer le temps de chargement initial de votre application. Toutefois, cela nĂ©cessite une configuration supplĂ©mentaire. Vous devrez vous assurer que le serveur peut correctement gĂ©rer les importations dynamiques et que les composants chargĂ©s paresseusement sont correctement hydratĂ©s du cĂŽtĂ© client.
Des outils comme Next.js et Gatsby.js offrent une prise en charge intégrée du lazy loading et de la division du code dans les environnements SSR, ce qui facilite grandement le processus.
3. Préchargement des composants chargés paresseusement
Dans certains cas, vous voudrez peut-ĂȘtre prĂ©charger un composant chargĂ© paresseusement avant qu'il ne soit rĂ©ellement nĂ©cessaire. Cela peut ĂȘtre utile pour les composants qui sont susceptibles d'ĂȘtre rendus bientĂŽt, tels que les composants situĂ©s sous la ligne de flottaison mais qui sont susceptibles d'ĂȘtre affichĂ©s. Vous pouvez prĂ©charger un composant en appelant manuellement la fonction import() :
import('./MyComponent'); // Preload MyComponent
Cela démarrera le chargement du composant en arriÚre-plan, de sorte qu'il sera disponible plus rapidement lorsqu'il sera réellement rendu.
4. Importations dynamiques avec commentaires magiques Webpack
Les "commentaires magiques" de Webpack permettent de personnaliser les noms des morceaux de code gĂ©nĂ©rĂ©s. Cela peut ĂȘtre utile pour dĂ©boguer et analyser la structure du bundle de votre application. Par exemple :
const MyComponent = React.lazy(() => import(/* webpackChunkName: "my-component" */ './MyComponent'));
Cela créera un morceau de code nommé "my-component.js" (ou similaire) au lieu d'un nom générique.
5. Ăviter les piĂšges courants
Sur-division : Diviser votre code en trop petits morceaux peut en fait diminuer les performances en raison de la surcharge liĂ©e Ă la rĂ©alisation de plusieurs requĂȘtes rĂ©seau. Trouvez un Ă©quilibre qui fonctionne pour votre application.
Placement incorrect de Suspense : Assurez-vous que vos limites <Suspense> sont placĂ©es de maniĂšre appropriĂ©e pour offrir une bonne expĂ©rience utilisateur. Ăvitez d'envelopper des pages entiĂšres dans <Suspense> si possible.
Oublier les limites d'erreur : Utilisez toujours les limites d'erreur pour gérer les erreurs potentielles pendant le lazy loading.
Exemples concrets et cas d'utilisation
Le lazy loading peut ĂȘtre appliquĂ© Ă un large Ă©ventail de scĂ©narios pour amĂ©liorer les performances des applications React. Voici quelques exemples :
Sites web de commerce électronique : Le lazy loading des images de produits, des vidéos et des descriptions de produits détaillées peut améliorer considérablement le temps de chargement initial des pages de produits.
Blogs et sites web d'actualités : Le lazy loading des images, des vidéos intégrées et des sections de commentaires peut améliorer l'expérience de lecture et réduire les taux de rebond.
Tableaux de bord et panneaux d'administration : Le lazy loading des graphiques, des diagrammes et des tableaux de données complexes peut améliorer la réactivité des tableaux de bord et des panneaux d'administration.
Applications monopages (SPA) : Le lazy loading des routes et des composants peut réduire le temps de chargement initial des SPA et améliorer l'expérience utilisateur globale.
Applications internationalisées : Charger les ressources spécifiques à la langue (texte, images, etc.) uniquement lorsque cela est nécessaire pour la langue de l'utilisateur. Par exemple, charger les traductions allemandes pour un utilisateur en Allemagne et les traductions espagnoles pour un utilisateur en Espagne.
Exemple : Site web de commerce électronique international
Imaginez un site web de commerce électronique vendant des produits dans le monde entier. Différents pays peuvent avoir des devises, des langues et des catalogues de produits différents. Au lieu de charger toutes les données pour chaque pays au départ, vous pouvez utiliser le lazy loading pour charger les données spécifiques à l'emplacement de l'utilisateur uniquement lorsqu'il visite le site.
const CurrencyFormatter = React.lazy(() => import(`./CurrencyFormatter/${userCountry}`))
const ProductCatalog = React.lazy(() => import(`./ProductCatalog/${userCountry}`))
function ECommerceSite() {
const userCountry = getUserCountry(); // Fonction pour déterminer le pays de l'utilisateur
return (
Loading content for your region...}>
);
}
Conclusion
Le lazy loading et la division du code en composants sont des techniques puissantes pour optimiser les performances des applications React. En ne chargeant les composants que lorsqu'ils sont nécessaires, vous pouvez réduire considérablement le temps de chargement initial, améliorer l'expérience utilisateur et améliorer votre SEO. Les composants intégrés React.lazy() et <Suspense> de React facilitent l'implémentation du lazy loading dans vos projets. Adoptez ces techniques pour créer des applications web plus rapides, plus réactives et plus attrayantes pour un public mondial.
N'oubliez pas de toujours tenir compte de l'expérience utilisateur lors de l'implémentation du lazy loading. Fournissez des interfaces utilisateur de repli informatives, gérez gracieusement les erreurs potentielles et analysez attentivement les performances de votre application pour vous assurer d'obtenir les résultats souhaités. N'ayez pas peur d'expérimenter différentes approches et de trouver la meilleure solution pour vos besoins spécifiques.